; 读到18号扇区
org 0x7c00
jmp entry
db 0x90
db "HELLOIPL" ; 8 bytes 启动区标识
dw 512 ; bytes per sector
db 1 ; sectors per cluster
dw 1 ; reserved sectors
db 2 ; number of FATs (2) FAT表数
dw 224 ; root entries (224 * 32 = 7168) 根目录文件数
dw 2880 ; number of sectors (2880 * 512 = 1474560) 扇区总数
db 0xf0 ; media descriptor (0xf0 = 1.44MB 3.5 in. floppy)
dw 9 ; sectors per FAT (9 * 512 = 4608) 每个FAT扇区数
dw 18 ; sectors per track (18 * 512 = 9216) 每个磁道扇区数
dw 2 ; number of heads (2) 磁头数
dd 0 ; hidden sectors (0) 隐藏扇区数
dd 2880 ; total sectors (2880 * 512 = 1474560) 扇区总数
db 0 ; drive number (0)
db 0 ; reserved
db 0x29 ; boot signature (0x29)
dd 0xffffffff ; volume ID
db "HELLO-OS   " ; volume label
db "FAT12   " ; file system type 8 bytes
times 18 db 0
;resb 18 ; boot code

entry:
	mov ax, 0
	mov ss, ax
	mov sp, 0x7c00
	mov ds, ax

	mov ax, 0x0820 
	mov es, ax
	mov ch, 0 ; 柱面号
	mov dh, 0 ; 磁头号
	mov cl, 2 ; 起始扇区号

	; 将c0-h0-s2到c0-h0-s18的内容读到内存0x8200处
readloop:
	mov si, 0 ; 记录失败次数
retry:
	mov al, 1 ; 扇区数
	mov ah, 0x02 ; 功能号
	mov bx, 0 ; 缓冲区地址
	mov dl, 0 ; 驱动器号
	int 0x13 ; 调用BIOS中断
	jnc next
	add si, 1
	cmp si, 5
	jae error
	mov ah, 0 ; 重置磁盘
	mov dl, 0 ; 驱动器号
	int 0x13 ; 重置磁盘
	jmp retry

	; 将内存地址后移0x200
next:
	mov ax, es
	add ax, 0x20
	mov es, ax
	add cl, 1
	cmp cl, 18
	jbe readloop
	
fin:
	hlt
	jmp fin

error:
	mov si, msg
putloop:
	mov al, [si]
	add si, 1
	cmp al, 0
	je fin
	mov ah, 0x0e ; 显示一个字符
	mov bx, 15 ; 颜色
	int 0x10 ; 调用BIOS中断
	jmp putloop
msg:
	db 0x0a, 0x0a ; 换行两次
	db "load error"
	db 0x0a
	db 0

times 510-($-$$) db 0
dw 0xaa55

